Total Results
Exam attempts completed
Average Score
Across all attempts
Highest Score
Best performance
Lowest Score
Worst performance
prepare("SELECT session_id FROM results WHERE id = ?"); $stmt->execute([$delete_id]); $result = $stmt->fetch(PDO::FETCH_ASSOC); if ($result) { // Delete student answers $stmt = $pdo->prepare("DELETE FROM student_answers WHERE session_id = ?"); $stmt->execute([$result['session_id']]); // Delete result $stmt = $pdo->prepare("DELETE FROM results WHERE id = ?"); $stmt->execute([$delete_id]); // Update exam session $stmt = $pdo->prepare("UPDATE exam_sessions SET status = 'abandoned' WHERE id = ?"); $stmt->execute([$result['session_id']]); $success = "Result deleted successfully!"; } } catch (PDOException $e) { $error = "Error deleting result: " . $e->getMessage(); } } // Handle bulk actions if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['bulk_action'])) { $bulk_action = sanitize_input($_POST['bulk_action']); $selected_results = $_POST['selected_results'] ?? []; if (empty($selected_results)) { $error = "Please select at least one result to perform bulk action."; } else { try { $placeholders = str_repeat('?,', count($selected_results) - 1) . '?'; if ($bulk_action === 'delete') { // Get session IDs for selected results $stmt = $pdo->prepare("SELECT session_id FROM results WHERE id IN ($placeholders)"); $stmt->execute($selected_results); $sessions = $stmt->fetchAll(PDO::FETCH_COLUMN); if ($sessions) { // Delete student answers $session_placeholders = str_repeat('?,', count($sessions) - 1) . '?'; $stmt = $pdo->prepare("DELETE FROM student_answers WHERE session_id IN ($session_placeholders)"); $stmt->execute($sessions); // Delete results $stmt = $pdo->prepare("DELETE FROM results WHERE id IN ($placeholders)"); $stmt->execute($selected_results); // Update exam sessions $stmt = $pdo->prepare("UPDATE exam_sessions SET status = 'abandoned' WHERE id IN ($session_placeholders)"); $stmt->execute($sessions); $success = count($selected_results) . " result(s) deleted successfully!"; } } elseif ($bulk_action === 'export') { // Export functionality would go here $success = "Export functionality for " . count($selected_results) . " result(s) would be implemented here."; } } catch (PDOException $e) { $error = "Error performing bulk action: " . $e->getMessage(); } } } // Get filter parameters $exam_id = $_GET['exam_id'] ?? ''; $student_id = $_GET['student_id'] ?? ''; $date_from = $_GET['date_from'] ?? ''; $date_to = $_GET['date_to'] ?? ''; $min_score = $_GET['min_score'] ?? ''; $max_score = $_GET['max_score'] ?? ''; // Build query for results with filters $query = " SELECT r.*, es.student_id, es.exam_id, es.start_time, es.end_time, s.reg_number, s.full_name as student_name, e.name as exam_name, e.year as exam_year FROM results r JOIN exam_sessions es ON r.session_id = es.id JOIN students s ON es.student_id = s.id JOIN exams e ON es.exam_id = e.id WHERE 1=1 "; $params = []; // Apply filters if ($exam_id) { $query .= " AND es.exam_id = ?"; $params[] = $exam_id; } if ($student_id) { $query .= " AND es.student_id = ?"; $params[] = $student_id; } if ($date_from) { $query .= " AND DATE(r.submitted_at) >= ?"; $params[] = $date_from; } if ($date_to) { $query .= " AND DATE(r.submitted_at) <= ?"; $params[] = $date_to; } if ($min_score) { $query .= " AND r.percentage >= ?"; $params[] = $min_score; } if ($max_score) { $query .= " AND r.percentage <= ?"; $params[] = $max_score; } // Add sorting $sort = $_GET['sort'] ?? 'submitted_at'; $order = $_GET['order'] ?? 'desc'; $allowed_sorts = ['submitted_at', 'percentage', 'correct_answers', 'student_name', 'exam_name']; $allowed_orders = ['asc', 'desc']; $sort = in_array($sort, $allowed_sorts) ? $sort : 'submitted_at'; $order = in_array($order, $allowed_orders) ? $order : 'desc'; $query .= " ORDER BY $sort $order"; $stmt = $pdo->prepare($query); $stmt->execute($params); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); // Get exams for filter dropdown $stmt = $pdo->prepare("SELECT id, name, year FROM exams ORDER BY year DESC, name"); $stmt->execute(); $exams = $stmt->fetchAll(PDO::FETCH_ASSOC); // Get students for filter dropdown $stmt = $pdo->prepare("SELECT id, reg_number, full_name FROM students ORDER BY full_name"); $stmt->execute(); $students = $stmt->fetchAll(PDO::FETCH_ASSOC); // Calculate statistics $total_results = count($results); $average_score = $total_results > 0 ? array_sum(array_column($results, 'percentage')) / $total_results : 0; $highest_score = $total_results > 0 ? max(array_column($results, 'percentage')) : 0; $lowest_score = $total_results > 0 ? min(array_column($results, 'percentage')) : 0; // Score distribution $score_ranges = [ '90-100' => 0, '80-89' => 0, '70-79' => 0, '60-69' => 0, '50-59' => 0, '0-49' => 0 ]; foreach ($results as $result) { $score = $result['percentage']; if ($score >= 90) $score_ranges['90-100']++; elseif ($score >= 80) $score_ranges['80-89']++; elseif ($score >= 70) $score_ranges['70-79']++; elseif ($score >= 60) $score_ranges['60-69']++; elseif ($score >= 50) $score_ranges['50-59']++; else $score_ranges['0-49']++; } ?>
Comprehensive overview of student performance and exam results
Exam attempts completed
Across all attempts
Best performance
Worst performance